跳到主要内容

数据绑定(Data Binding)

脚本编写(Scripting)允许您读取、修改并订阅视图模型(View Model)属性的更改,以及在运行时创建新的视图模型(View Model)实例。

提示(Tip) 有关视图模型(View Models)及其如何驱动图形的概念性概述,请参见 视图模型与数据绑定(View Models & Data Binding)

视图模型(View Models)

脚本(Script)可以通过三种方式访问视图模型(View Models)及其属性:

上下文(Context)

init 生命周期函数包含一个上下文(Context)参数,该参数可让您访问视图模型(View Models)。这使您可以读取值(字符串、枚举、列表等)、设置值、触发触发器、监听触发器,并订阅值的更改。

说明(Note) 除了视图模型(View Models)之外,上下文(Context) 还可让您访问命名资产和更新调度。

type MyNode = {}

function init(self: MyNode, context: Context): boolean
-- Get the view model from the node's immediate context.
local vmi = context:viewModel()

-- Get the root view model
local rootVmi = context:rootViewModel()

-- Get the view model from the parent node.
local parentDC = dc:parent()
local parentVmi = dc:viewModel()
end

return function(): Node<MyNode>
return {
init = init,
}
end

作为输入的视图模型(View Models as Inputs)

您可以创建一个脚本输入(Script Input),并将其绑定到视图模型(View Model)。这允许您读取值(字符串、枚举、列表等)、设置值、触发触发器、监听触发器,并订阅值的更改。

type MyNode = {
-- This input expects a view model instance of type Character
character: Input<Data.Character>
}

function init(self: MyNode, context: Context): boolean
local vmi = self.character
end

return function(): Node<MyNode>
return {
init = init,
-- Initialize with `late()` so the value
-- can be provided by the editor at runtime.
character = late(),
}
end

有关详细说明,请参见 视图模型输入(View Models Inputs)

绑定输入(Binding Inputs)

如果只需要读取而不需要设置视图模型(View Model)属性,可以将视图模型(View Model)属性值绑定到脚本输入。 有关更多信息,请参见 数据绑定输入(Data Binding Inputs)

嵌套视图模型(Nested View Models)

要引用嵌套的视图模型(View Model),请使用 getViewModel

local vmi = context:viewModel(),
local dateVmi = vmi:getViewModel('dateViewModel')

读取与设置属性(Reading and Setting Properties)

以下方法允许您引用视图模型(View Model)属性:

local vmi = context:viewModel()

if vmi then
-- Get a reference to the score property from the view model
local score = vmi:getNumber('score')
if score then
-- Read the score
print(score.value)

-- Set the score
score.value = 100
end

-- Get a reference to the myTrigger property from the view model
local myTrigger = vmi:getTrigger('myTrigger')
if myTrigger then
-- Fire the trigger
mytrigger:fire()
end
end

监听属性更改(Listening for Property Changes)

添加监听器(Add a Listener)

使用 addListener 监听触发器或视图模型(View Model)属性的更改。

type MyNode = {}

function handleHoursChanged()
print('hours changed!')
end

function handleTriggerFired()
print('Fire!')
end

function init(self: MyNode, context: Context): boolean
local vmi = context:viewModel()

local hours = vm:getNumber('hours')
if hours then
-- handleHoursChanged is called whenever the hours value changes
hours:addListener(handleHoursChanged)
end

local trigger = vm:getTrigger('triggerProperty')
if trigger then
-- handleTriggerFired is called whenever the trigger is fired
trigger:addListener(handleTriggerFired)
end

return true
end

return function(): Node<MyNode>
return {
init = init,
}
end

移除监听器(Remove a Listener)

不再需要监听器时,请始终移除它们以避免内存泄漏。

type MyNode = {}

function init(self: MyNode, context: Context): boolean
local vmi = context:viewModel()

if not vmi then
print('No view model found')
return false
end

local hours = vmi:getNumber('hours')
if hours then
local function handleHoursChanged()
print('hours changed!')

-- Remove the event listener
hours:removeListener(handleHoursChanged)
end

-- handleHoursChanged is called whenever the hours value changes
hours:addListener(handleHoursChanged)
end

return true
end

return function(): Node<MyNode>
return {
init = init,
hours = late(),
trigger = late(),
}
end

创建视图模型(View Model)实例

敬请期待